package eclipse_sync_plugin;

import java.nio.file.Path;
import java.time.Instant;
import java.time.format.DateTimeFormatter;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.ILog;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.ITextViewer;
import org.eclipse.jface.text.TextViewer;
import org.eclipse.jface.text.source.projection.ProjectionViewer;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.ide.FileStoreEditorInput;
import org.eclipse.ui.part.FileEditorInput;
import org.eclipse.ui.texteditor.AbstractTextEditor;

/**
 * 光标位置记录器
 * 负责获取当前编辑器的光标位置信息并生成JSON数据
 * 该数据将通过TCP发送给Cursor插件用于实现Eclipse和Cursor之间的跳转
 */
public class CursorPositionWriter {
    /** Eclipse日志记录器 */
    private ILog logger;
    
    /**
     * 构造函数
     * 初始化日志记录器
     */
    public CursorPositionWriter() {
        try {
            this.logger = Platform.getLog(Platform.getBundle("eclipse-sync-plugin"));
        } catch (Exception e) {
            System.err.println("初始化日志失败: " + e.getMessage());
            e.printStackTrace();
        }
    }
    
    /**
     * 获取当前编辑器光标位置的JSON数据
     * 
     * @param editor 当前活动的编辑器实例
     * @return JSON格式的光标位置数据，如果获取失败则返回null
     */
    public String getCurrentPositionJson(IEditorPart editor) {
        try {
            // 获取文件路径
            IEditorInput input = editor.getEditorInput();
            Path fullPath;
            
            // 根据不同的编辑器输入类型获取文件路径
            if (input instanceof FileEditorInput) {
                // 处理工作区内的文件
                IFile file = ((FileEditorInput) input).getFile();
                fullPath = Path.of(file.getLocationURI());
            } else if (input instanceof FileStoreEditorInput) {
                // 处理工作区外的文件
                fullPath = Path.of(((FileStoreEditorInput) input).getURI());
            } else {
                // 记录不支持的编辑器输入类型
                logger.log(new Status(IStatus.WARNING, "eclipse-sync-plugin", 
                    "编辑器输入不是文件类型：" + input.getClass().getPackageName() + ":" + input.getClass().getName()));
                return null;
            }

            // 获取文本视图
            TextViewer viewer = null;
            if (editor instanceof AbstractTextEditor) {
                // 标准文本编辑器
                viewer = (TextViewer) ((AbstractTextEditor) editor).getAdapter(ITextViewer.class);
            } else {
                // 其他类型的编辑器
                viewer = (TextViewer) editor.getAdapter(ITextViewer.class);
            }

            if (viewer == null) {
                logger.log(new Status(IStatus.WARNING, "eclipse-sync-plugin", "无法获取编辑器的文本视图"));
                return null;
            }

            // 获取光标位置（行号和列号）
            int line, column;
            if (!(viewer instanceof ProjectionViewer)) {
                // 使用StyledText直接获取位置
                org.eclipse.swt.custom.StyledText styledText = viewer.getTextWidget();
                int caretOffset = styledText.getCaretOffset();
                line = styledText.getLineAtOffset(caretOffset) + 1;
                column = caretOffset - styledText.getOffsetAtLine(line - 1) + 1;
            } else {
                // 使用ProjectionViewer获取位置（处理折叠代码的情况）
                ProjectionViewer projectionViewer = (ProjectionViewer) viewer;
                IDocument doc = projectionViewer.getDocument();
                org.eclipse.swt.custom.StyledText styledText = projectionViewer.getTextWidget();
                int caretOffset = styledText.getCaretOffset();
                int modelOffset = projectionViewer.widgetOffset2ModelOffset(caretOffset);
                if (modelOffset < 0) modelOffset = 0;
                line = doc.getLineOfOffset(modelOffset) + 1;
                column = modelOffset - doc.getLineOffset(line - 1) + 1;
            }

            // 生成ISO8601格式的时间戳
            String timestamp = DateTimeFormatter.ISO_INSTANT.format(Instant.now());

            // 构建JSON格式的状态数据
            String json = String.format(
                "{\n" +
                "  \"file_path\": \"%s\",\n" +
                "  \"line_number\": %d,\n" +
                "  \"column\": %d,\n" +
                "  \"timestamp\": \"%s\"\n" +
                "}",
                fullPath.toString().replace("\\", "\\\\"),
                line,
                column,
                timestamp
            );

            logger.log(new Status(IStatus.INFO, "eclipse-sync-plugin", 
                "已生成光标位置数据: " + json));
            return json;
            
        } catch (Exception e) {
            logger.log(new Status(IStatus.ERROR, "eclipse-sync-plugin",
                "生成光标位置数据时发生错误: " + e.getMessage(), e));
            return null;
        }
    }

//    /**
//     * 处理从Cursor接收到的消息
//     * 
//     * @param message 接收到的JSON消息
//     */
//    public void handleReceivedMessage(String message) {
//        try {
//            // 解析JSON消息
//            JSONObject json = new JSONObject(message);
//            String filePath = json.getString("file_path");
//            int lineNumber = json.getInt("line_number");
//            int column = json.getInt("column");
//            
//            // 构建命令行参数
//            ProcessBuilder processBuilder = new ProcessBuilder(
//                Activator.getDefault().getPreferenceStore().getString(PluginPreferencePage.PREF_ECLIPSE_PATH),
//                "--launcher.openFile",
//                filePath + ":" + lineNumber + ":" + column
//            );
//            
//            // 启动新进程
//            Process process = processBuilder.start();
//            
//            // 记录日志
//            logger.log(new Status(IStatus.INFO, "eclipse-sync-plugin",
//                "正在打开文件: " + filePath + " 行: " + lineNumber + " 列: " + column));
//                
//        } catch (Exception e) {
//            logger.log(new Status(IStatus.ERROR, "eclipse-sync-plugin",
//                "处理接收到的消息时发生错误: " + e.getMessage(), e));
//        }
//    }
}